package br.com.dponto.web;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;

import org.primefaces.model.StreamedContent;

import br.com.dponto.ponto.Ponto;
import br.com.dponto.ponto.PontoRN;
import br.com.dponto.usuario.Usuario;
import br.com.dponto.util.ContextoUtil;
import br.com.dponto.util.RelatorioUtil;
import br.com.dponto.util.UtilException;

@ManagedBean
@RequestScoped
public class PontoBean {

	private Usuario usuario = new Usuario();
	private Ponto ponto = new Ponto();
	private String tipoPonto;
	private List<Ponto> lista = null;
	private List<Ponto> listaPonto = null;
	private StreamedContent arquivoRetorno;
	private int tipoRelatorio;

	public Usuario usuarioLogado() {
		ContextoBean contextoBean = ContextoUtil.getContextoBean();
		Usuario usuario = new Usuario();
		usuario = contextoBean.getUsuarioLogado();
		return usuario;
	}

	
	
	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	public List<Ponto> getListaPonto() {	
		this.usuario = usuarioLogado();
		this.listaPonto = new ArrayList<Ponto>();
		PontoRN pontoRN = new PontoRN();
		Date data = new Date();
		this.ponto = pontoRN.buscarPorData(data, usuario);
		this.listaPonto.add(ponto);
		return this.listaPonto;		
	}

	public List<Ponto> getLista() {
		return lista;
	}

	public String baterPonto() {
		// VALORES PARA SITUAÇAO 0:sucesso, 1:entre primeiro, 2:já existe, 3:saia para almoço.
		FacesContext context = FacesContext.getCurrentInstance();
		this.usuario = usuarioLogado();
		this.ponto.setTipo(Integer.parseInt(tipoPonto));	
		this.ponto.setUsuario(usuario);
		
		if (ponto.getTipo() == 1) {
			pontoEntrada();
		} else if (ponto.getTipo() == 2) {
			pontoAlmoco();
		} else if (ponto.getTipo() == 3) {
			pontoRetornoAlmoco();
		} else {
			pontoSaida();
		}
		PontoRN pontoRN = new PontoRN();

		int registrar = pontoRN.baterPonto(this.ponto);
		if (registrar == 0) {
			FacesMessage msg = new FacesMessage("Ponto registrado com sucesso.");
			context.addMessage(null, msg);
			return null;
		} else if (registrar == 1) {
			FacesMessage msg = new FacesMessage(
					"Ponto de entrada ainda não foi registrado. Necessário registrar o horário de sua entrada.");
			context.addMessage(null, msg);
			return null;
		} else if (registrar == 2) {
			FacesMessage msg = new FacesMessage(
					"Já existe um ponto registrado para essa ação.");
			context.addMessage(null, msg);
			return null;

		} else{
			FacesMessage msg = new FacesMessage("Sai para almoço.");
			context.addMessage(null, msg);
		}
		
		 this.ponto = new Ponto();
		 this.listaPonto = null;
		return "/restrito/principal.xhtml";

	}

	public void pontoEntrada() {
		Date data = new Date();
		this.ponto.setData(data);
		this.ponto.setHora_entrada(data);

	}

	public void pontoAlmoco() {
		Date data = new Date();
		this.ponto.setData(data);
		this.ponto.setInicio_almoco(data);
	}

	public void pontoRetornoAlmoco() {
		Date data = new Date();
		this.ponto.setData(data);
		this.ponto.setFim_almoco(data);

	}

	public void pontoSaida() {
		Date data = new Date();
		this.ponto.setData(data);
		this.ponto.setSaida(data);

	}

	public Ponto getPonto() {
		return ponto;
	}

	public void setPonto(Ponto ponto) {
		this.ponto = ponto;
	}

	public String getTipoPonto() {
		return tipoPonto;
	}

	public void setTipoPonto(String tipoPonto) {
		this.tipoPonto = tipoPonto;
	}

	public StreamedContent getArquivoRetorno() {
		FacesContext context = FacesContext.getCurrentInstance();
	
		String usuario = usuarioLogado().getLogin();
		String nomeRelatorioJasper = "ponto";
		String nomeRelatorioSaida = usuario+"_ponto";
		RelatorioUtil relatorioUtil = new RelatorioUtil();
		HashMap parametrosRelatorio = new HashMap();
		
		parametrosRelatorio.put("codigoUsuario", usuarioLogado().getCodigo());
		
		try {
			
			this.arquivoRetorno = relatorioUtil.geraRelatorio(parametrosRelatorio, nomeRelatorioJasper, nomeRelatorioSaida, this.tipoRelatorio);
			
		} catch (UtilException e) {
			context.addMessage(null, new FacesMessage(e.getMessage()));
			return null;
		}
		
		return this.arquivoRetorno;
	}

	public void setArquivoRetorno(StreamedContent arquivoRetorno) {
		this.arquivoRetorno = arquivoRetorno;
	}



	public int getTipoRelatorio() {
		return tipoRelatorio;
	}



	public void setTipoRelatorio(int tipoRelatorio) {
		this.tipoRelatorio = tipoRelatorio;
	}

	
	

}
